//package com.yx.cloud.product.laser.tuyapublic;
//
//import android.content.Context;
//import android.graphics.PointF;
//import android.util.Log;
//
//import com.aaa.async.DeferredObject;
//import com.aaa.async.DoneCallback;
//import com.aaa.async.FailCallback;
//import com.aaa.async.ProgressivePromise;
//import com.aaa.async.Promise;
//import com.alibaba.fastjson.JSONObject;
//import com.google.gson.Gson;
//
//import com.iot.base.bean.Device;
//import com.yx.cloud.MyApplication;
//import com.yx.cloud.R;
////import com.yx.cloud.product.TuyaProduct;
//import com.yx.cloud.product.gyro.AlarmUtils;
//
//import com.yx.cloud.utils.PathUtils;
//
//import com.iot.product.sweeper.bean.AreaInfo;
//
//import com.iot.product.sweeper.bean.CleanRecord;
//
//import com.iot.product.sweeper.bean.Robot;
//import com.iot.product.sweeper.bean.RobotStatus;
//import com.iot.product.sweeper.bean.Room;
//
//import com.iot.common.utils.Event;
//
//import com.iot.common.utils.LogUtils;
//
//import org.json.JSONException;
//
//import java.io.UnsupportedEncodingException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.TimeZone;
//
//public class TuyaLaser extends TuyaProduct /*implements TuyaListener*/ {
//    protected TuyaLaser() {
//    }
///*
//    public static TuyaLaser get() {
//        return InstanceHoder.TUYA_LASER;
//    }
//
//
//    @Override
//    public void connectDevice(Device device) {
//        ((Robot) device).getMap().setMap(new TuyaLaserMap());
//        ((Robot) device).getMap().setPath(new TuyaLaserPath());
//        TuyaSdk.get().connectDevice(device, this);
//        if (config.isP2PChannel) {
//            TuyaSdk.get().startP2PService(device);
//        } else {
//            TuyaSdk.get().startCloudChannel(device);
//        }
//    }
//
//    @Override
//    public void disconnectDevice(Device device) {
//        if (config.isP2PChannel) {
//            TuyaSdk.get().stopP2PService();
//        } else {
//            TuyaSdk.get().stopCloudChannel();
//        }
//        TuyaSdk.get().disconnectDevice(device);
//    }
//
//    @Override
//    public void onDpUpload(String dp) {
//        //dp点数据解析
//        TuyaLaserDataConverter.parseDp(dp);
//    }
//
//    @Override
//    public void onChannelData(Object data, int dataType) {
//        if (data == null) {
//            return;
//        }
//        //LogUtils.i("tuyapublic data string is" + (String)data);
//        Robot robot = AppContext.get().getCurrentDevice();
//        LogUtils.i("tuyapublic data type is" + dataType);
//        if (dataType == LibConstants.MAP_DATA) {
//            //ParseResult mapResult = TuyaPublicMapDataParser.parseMapData((TuyaLaserMap) (robot.getMap().getMap()), (TuyaLaserPath) (robot.getMap().getPath()), robot.getMap().getArea(), hexStringToBytes((String)data));
//            ParseResult mapResult = TuyaPublicMapDataParser.parseMapData((TuyaLaserMap) (robot.getMap().getMap()), (TuyaLaserPath) (robot.getMap().getPath()), robot.getMap().getArea(), (byte[]) data);
//            LogUtils.i("tuyapublic map result is" + mapResult.getCode());
//            if (mapResult.getCode() == ParseResult.MSG_PARSE_SUCCESS) {
//                LogUtils.i("tuyapublic map data refresh");
//                TuyaLaserMap map = (TuyaLaserMap) (robot.getMap().getMap());
//                //充电座位置
//                robot.getMap().getPower().setX(map.dockerPosX);
//                robot.getMap().getPower().setY(map.dockerPosY);
//                LogUtils.i("tuyapublic power location x ==  " + map.dockerPosX + "y == " + map.dockerPosY);
//                robot.getMap().getPower().setRotation((float) map.dockertheta);
//
//                //机器位置
//                int endIndex = robot.getMap().getPath().destPathPoints.size() - 1;
//                if (endIndex >= 0) {
//                    PathPoint sweeperPoint = robot.getMap().getPath().destPathPoints.get(endIndex);
//                    float rotation = PathUtils.getRotationFromPath(robot.getMap().getPath().destPathPoints);
//                    robot.getMap().getSweeper().set(sweeperPoint.x, sweeperPoint.y, rotation);
//                }
//
//                Event.newBuilder().type(Event.MSG_ROBOT_MAP).result(true).content(robot.getMap().getMap()).send();
//
//                if (map.tempRoomData != null && map.tempRoomData.length > 0) {
//                    */
///*Log.d("pppppp","parse room");
//                    ParseResult roomResult = TuyaPublicMapDataParser.parseRoomData((TuyaPublicMap) (robot.getMap().getMap()), robot.getMap().getRoom(), map.tempRoomData);
//                    if(roomResult.getCode() == ParseResult.MSG_PARSE_SUCCESS){
//                        Log.d("pppppp","parse room success");
//                        //Log.d("pppppp","parse map id size is " + map.room.size());
//                        Log.d("pppppp","parse room size is " + robot.getMap().getRoom().size());
//                    }*//*
//
//                    TuyaPublicMapDataParser.parseRoomData((TuyaLaserMap) (robot.getMap().getMap()), robot.getMap().getRoom(), map.tempRoomData);
//
//                    if (map.roomsId != null && map.roomsId.size() > 0) {
//                        for (int i = 0; i < map.room.size(); i++) {
//                            for (int j = 0; j < robot.getMap().getRoom().size(); j++) {
//                                if (map.room.get(i).getId() == robot.getMap().getRoom().get(j).getId()) {
//                                    robot.getMap().getRoom().get(j).setCenter(map.room.get(i).getCenter());
//                                }
//                            }
//                        }
//                    } else {
//                        robot.getMap().getRoom().clear();
//                    }
//                } else {
//                    robot.getMap().getRoom().clear();
//                }
//                Event.newBuilder().type(Event.MSG_ROBOT_ROOM).result(true).content(robot.getMap().getRoom()).send();
//            } else if (mapResult.getCode() == ParseResult.MSG_PARSE_FAIL_DATA_NOT_MATCH) {
//                LogUtils.i("tuyapublic  map clear" + mapResult.getCode());
//                robot.getMap().getRoom().clear();
//                robot.getMap().getArea().clear();
//                robot.getMap().getPath().clear();
//                robot.getMap().getSweeper().clear();
//                robot.getMap().getPower().clear();
//                robot.getMap().getMap().mapData = null;
//                //                robot.getMap().clear();
//                Event.newBuilder().type(Event.MSG_ROBOT_MAP).result(true).content(robot.getMap().getMap()).send();
//            }
//        } else if (dataType == LibConstants.PATH_DATA) {
//            //ParseResult pathResult = TuyaPublicMapDataParser.parsePathData((TuyaLaserMap) (robot.getMap().getMap()), (TuyaLaserPath) (robot.getMap().getPath()), hexStringToBytes((String)data));
//            ParseResult pathResult = TuyaPublicMapDataParser.parsePathData((TuyaLaserMap) (robot.getMap().getMap()), (TuyaLaserPath) (robot.getMap().getPath()), (byte[]) data);
//            Log.d("path refresh", "pathResult code is " + pathResult.getCode());
//            if (pathResult.getCode() == ParseResult.MSG_PARSE_SUCCESS) {
//                TuyaLaserPath path = (TuyaLaserPath) (robot.getMap().getPath());
//                //机器位置
//                if (path.destPathPoints.size() > 0) {
//                    PathPoint sweeperPoint = path.destPathPoints.get(path.destPathPoints.size() - 1);
//                    float rotation = PathUtils.getRotationFromPath(robot.getMap().getPath().destPathPoints);
//                    robot.getMap().getSweeper().set(sweeperPoint.x, sweeperPoint.y, rotation);
//                } else {
//                    robot.getMap().getSweeper().set(0, 0, 0);
//                }
//                Log.d("path refresh", "send MSG_ROBOT_PATH msg");
//                LogUtils.i("tuyapublic sweeper xy : " + robot.getMap().getSweeper().x + " " + robot.getMap().getSweeper().y);
//                Event.newBuilder().type(Event.MSG_ROBOT_PATH).result(true).content(robot.getMap().getPath()).send();
//            } else if (pathResult.getCode() == ParseResult.MSG_PARSE_CLEAR_DATA) {
//                robot.getMap().getPath().clear();
//                robot.getMap().getSweeper().clear();
//                Event.newBuilder().type(Event.MSG_ROBOT_PATH).result(true).content(robot.getMap().getPath()).send();
//            }
//        }
//    }
//
//    @Override
//    public Promise<List<IotMessage>, TuyaSdkException> getWarningNotification(GetNotificationParam param) {
//        return TuyaSdk.get().getWarningNotification(param);
//    }
//
//    @Override
//    public Promise<Void, TuyaSdkException> tuyaBluetoothScan() {
//        return null;
//    }
//
//    @Override
//    public Promise<Void, TuyaSdkException> tuyaStopLeScan() {
//        return null;
//    }
//
//    @Override
//    public ProgressivePromise<Device, TuyaSdkException, String> addTuyaBluetoothDevice(BluetoothScanDeviceBean param) {
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> getFirmwareInfo() {
//        return null;
//    }
//
//
//    @Override
//    public Promise<Void, TuyaSdkException> getAppointmentList() {
//        Robot robot = AppContext.get().getCurrentDevice();
//        List<Appointment> list = robot.getAppointmentList();
//        LogUtils.i(" : ZW getAppointmentList ======");
//        Log.d("getAppointmentList", "mList is " + new Gson().toJson(list));
//        DeferredObject<Void, TuyaSdkException> deferredObject = new DeferredObject<>();
//        Event.newBuilder().type(Event.MESSAGE_TYPE_QUERY_ALARM).result(true).content(list).send();
//        deferredObject.resolve(null);
//        return deferredObject.promise();
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> addAppointment(Appointment param) {
//        List<Appointment> addAppointmentList = new ArrayList<>(AppContext.get().getCurrentDevice().getAppointmentList());
//        addAppointmentList.add(param);
//        return constructAppointment(addAppointmentList);
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> deleteAppointment(Appointment param) {
//        List<Appointment> appointmentList = new ArrayList<>(AppContext.get().getCurrentDevice().getAppointmentList());
//        for (int i = 0; i < appointmentList.size(); i++) {
//            if (appointmentList.get(i).getId() == param.getId()) {
//                appointmentList.remove(i);
//                break;
//            }
//        }
//        return constructAppointment(appointmentList);
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> changeAppointment(Appointment param) {
//        List<Appointment> appointmentList = new ArrayList<>(AppContext.get().getCurrentDevice().getAppointmentList());
//
//        for (int i = 0; i < appointmentList.size(); i++) {
//            if (appointmentList.get(i).getId() == param.getId()) {
//                appointmentList.set(i, param);
//                break;
//            }
//        }
//        return constructAppointment(appointmentList);
//    }
//
//
//    private Promise<Void, TuyaSdkException> constructAppointment(List<Appointment> appointmentList) {
//        Promise<Void, TuyaSdkException> result = null;
//        List<Byte> bytes = new ArrayList<>();
//        if (appointmentList.size() >= 0) {
//            int timeZone = TimeZone.getDefault().getRawOffset() / 3600000;
//            int appointmentNum = appointmentList.size();
//            bytes.add((byte) (timeZone & 0xff));
//            bytes.add((byte) (appointmentNum & 0xff));
//            for (int i = 0; i < appointmentNum; i++) {
//                Appointment appointment = appointmentList.get(i);
//                if (appointment.isEnable()) {
//                    bytes.add((byte) (0x01));
//                } else {
//                    bytes.add((byte) (0x00));
//                }
//
//                List<Integer> repeat = appointment.getRepeat();
//                if (repeat.size() > 0) {
//                    byte repeatByte = 0;
//                    for (Integer integer : repeat) {
//                        if (integer == 0) {
//                            repeatByte |= (byte) 0x01 << 6;
//                        } else {
//                            repeatByte |= (byte) 0x01 << (integer - 1);
//                        }
//
//                    }
//                    Log.d("repeat", "repeat is " + StringUtils.byteToBit(repeatByte));
//                    bytes.add(repeatByte);
//                } else {
//                    bytes.add((byte) (0x00));
//                }
//
//                int startHour = appointment.getTime() / 3600;
//                int startMin = appointment.getTime() % 3600 / 60;
//                bytes.add((byte) (startHour & 0xff));
//                bytes.add((byte) (startMin & 0xff));
//
//                com.yx.robot.bean.robot.CleanParam cleanParam = appointment.getCleanParam();
//                int cleanMode = appointment.getCleanMode();
//                List<Integer> roomIds = null;
//                if (cleanMode == 1) {
//                    roomIds = ((RoomCleanParam) cleanParam).getRoomIds();
//                }
//                if (roomIds == null || roomIds.size() == 0) {
//                    bytes.add((byte) (0x00));
//                    int suction = appointment.getCleanParam().suction;
//                    int humidity = appointment.getCleanParam().humidity;
//                    int cleanType = 0;
//                    if (suction == 0 && humidity != 0) {
//                        cleanType = 2;
//                    } else if (suction != 0 && humidity == 0) {
//                        cleanType = 1;
//                    } else if (suction != 0 & humidity != 0) {
//                        cleanType = 0;
//                    }
//
//                    bytes.add((byte) (cleanType & 0xff));
//                    bytes.add((byte) (suction & 0xff));
//                    bytes.add((byte) (humidity & 0xff));
//
//                    //清扫次数，默认为1次
//                    int cleanTimes = 1;
//                    bytes.add((byte) (cleanTimes & 0xff));
//                } else {
//                    bytes.add((byte) (roomIds.size() & 0xff));
//                    for (int roomId : roomIds) {
//                        Log.d("roomId", "roomId is " + roomId);
//                        bytes.add((byte) (roomId & 0xff));
//                    }
//                    int suction = appointment.getCleanParam().suction;
//                    int humidity = appointment.getCleanParam().humidity;
//                    int cleanType = 0;
//                    if (suction == 0 && humidity != 0) {
//                        cleanType = 2;
//                    } else if (suction != 0 && humidity == 0) {
//                        cleanType = 1;
//                    } else if (suction != 0 & humidity != 0) {
//                        cleanType = 0;
//                    }
//
//                    bytes.add((byte) (cleanType & 0xff));
//                    bytes.add((byte) (suction & 0xff));
//                    bytes.add((byte) (humidity & 0xff));
//
//                    //清扫次数，默认为1次
//                    int cleanTimes = 1;
//                    bytes.add((byte) (cleanTimes & 0xff));
//                }
//
//            }
//        }
//
//        byte[] sumData;
//        byte[] data;
//
//        if (bytes.size() > 0) {
//            sumData = new byte[bytes.size()];
//
//            for (int i = 0; i < bytes.size(); i++) {
//                sumData[i] = bytes.get(i);
//            }
//
//            data = getProtocolPackage((byte) 0x30, sumData);
//
//            HashMap<String, Object> hashMap1;
//            hashMap1 = new HashMap<>();
//            hashMap1.put("15", StringUtils.byte2hex(data));
//            LogUtils.i(" send appointment " + JSONObject.toJSONString(hashMap1));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap1));
//        }
//
//        return result;
//
//    }
//
//    */
///**
//     * 设置勿扰模式开关、时间
//     *
//     * @return
//     *//*
//
//    @Override
//    public Promise<?, TuyaSdkException> setQuiteTimeSettings(SetQuiteTimeParam param) {
//        //设置勿扰模式开关
//        if (param.hasSetSwitch()) {
//            HashMap hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.SWITCH_DISTURB, param.ismSwitch());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        if (param.hasSetTime()) {
//            int startHour = param.getStartHour();
//            int startMin = param.getStartMin();
//            int endHour = param.getEndHour();
//            int endMin = param.getEndMin();
//            int timeZone = TimeZone.getDefault().getRawOffset() / 3600000;
//
//            List<Byte> bytes = new ArrayList<>();
//            bytes.add((byte) (timeZone & 0xff));
//            bytes.add((byte) (startHour & 0xff));
//            bytes.add((byte) (startMin & 0xff));
//            bytes.add((byte) (0x00));
//            bytes.add((byte) (endHour & 0xff));
//            bytes.add((byte) (endMin & 0xff));
//            bytes.add((byte) (0x00));
//
//            byte[] sumData;
//            byte[] data;
//
//            if (bytes.size() > 0) {
//                sumData = new byte[bytes.size()];
//
//                for (int i = 0; i < bytes.size(); i++) {
//                    sumData[i] = bytes.get(i);
//                }
//
//                data = getProtocolPackage((byte) 0x32, sumData);
//
//                HashMap<String, Object> hashMap1;
//                hashMap1 = new HashMap<>();
//                hashMap1.put("15", StringUtils.byte2hex(data));
//                LogUtils.i("queit time " + JSONObject.toJSONString(hashMap1));
//                TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap1));
//            }
//        }
//
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> getQuiteTimeSettings() {
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> getComsuptionInfo() {
//        return null;
//    }
//
//    */
///**
//     * 耗材
//     *
//     * @param param
//     * @return
//     *//*
//
//    @Override
//    public Promise<?, TuyaSdkException> resetComsuptionInfo(ResetComsuptionParam param) {
//        String reset = param.getReset();
//        String dp = "";
//        HashMap<String, Object> hashMap = null;
//        //自动清扫
//        hashMap = new HashMap<>();
//        if (reset.equals("resetFilter")) {
//            //滤网
//            dp = TuyaLaserConstant.RESET_FILTER;
//        } else if (reset.equals("resetSidebrush")) {
//            //边刷
//            dp = TuyaLaserConstant.RESET_EDGE_BRUSH;
//        } else if (reset.equals("resetMainbrush")) {
//            //主刷
//            dp = TuyaLaserConstant.RESET_ROLL_BRUSH;
//        } else if (reset.equals("waterTankFilter")) {
//            //水箱滤网(x3)
//            dp = TuyaLaserConstant.WATER_TANKFI_LTER_RESET;
//        } else if (reset.equals("mop")) {
//            //拖布
//            dp = TuyaLaserConstant.RAG_LIFE_RESET;
//        }
//        hashMap.put(dp, true);
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> setCleanSettings(CleanSettingParam param) {
//        LogUtils.i("setCleanSettings ---------------------------TuyaLaser");
//        HashMap<String, Object> hashMap = null;
//        hashMap = new HashMap<>();
//        //音量
//        if (param.hasset_volume) {
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.VOLUME_SET, param.getVolume());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//        //吸力
//        if (param.hasset_suction) {
//            String fanString = LFDateUtils.getFanStringZw(param.getSuction());
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.SUCTION, fanString);
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        //水量
//        if (param.hasset_baseWater) {
//            String waterString = LFDateUtils.getWaterStringZw(param.getBaseWater());
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.CISTERN, waterString);
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        //地毯增压
//        if (param.hasset_carpetPressurize) {
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.AUTO_BOOST, param.isCarpetPressurize());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        //Y字清扫 精擦
//        if (param.hasset_fineBrush) {
//            LogUtils.i("setCleanSettings ---------------------------param.isCarpetPressurize : " + param.isFineBrush());
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.Y_MOP, param.isFineBrush());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//        //自动集尘开关
//        if (param.hasset_autoDust) {
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.DUST_COLLECTION_SWITCH, param.isAutoDust());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        //自动集尘频率
//        if (param.hasset_autoDust_frequency) {
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.DUST_COLLECTION_NUM, param.getAutoDustFrequency());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//        //断点续扫
//        if (param.hasset_breakpointResume) {
//            hashMap.clear();
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.BREAK_CLEAN, param.isBreakpointResume());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//        //定制模式
//        if (param.hasset_customSwitch) {
//            hashMap.clear();
//            hashMap.put(TuyaLaserConstant.CUSTOM_MODE, param.isCustomSwitch());
//            TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> getCleanSettings() {
//        return null;
//    }
//
//    @Override
//    public Promise<List<CleanRecord>, TuyaSdkException> getCleanRecord(GetCleanRecordParam param) {
//        DeferredObject<List<CleanRecord>, TuyaSdkException> deferredObject = new DeferredObject<>();
//        TuyaSdk.get().queryCleanRecord(param).done(new DoneCallback<List<RecordResult>>() {
//            @Override
//            public void onDone(List<RecordResult> recordResults) {
//                LogUtils.i("getCleanRecord :记录 : " + new Gson().toJson(recordResults));
//                List<CleanRecord> cleanRecords = new ArrayList<>();
//                for (int i = 0; i < recordResults.size(); i++) {
//                    RecordResult recordResult = recordResults.get(i);
//                    String[] extend = recordResult.getExtend().split("_");
//                    byte[] bytes = recordResult.getData();
//                    String date = extend[1].substring(0, 4) + "-" + extend[1].substring(4, 6) + "-" + extend[1].substring(6, 8);
//                    String time = extend[2].substring(0, 2) + ":" + extend[2].substring(2, 4) + ":" + extend[2].substring(4, 6);
//                    String startTime = date + "  " + time;
//                    int cleanTime = Integer.valueOf(extend[3]);
//                    int cleanArea = Integer.valueOf(extend[4]);
//                    CleanRecord cleanRecorAapterBean = new CleanRecord();
//                    cleanRecorAapterBean.setStartTime(startTime);
//                    cleanRecorAapterBean.setCleanTime(cleanTime);
//                    cleanRecorAapterBean.setArea(cleanArea);
//                    cleanRecorAapterBean.setIsDoneNormal(1);
//                    TuyaPublicMapDataParser.parseRecord(cleanRecorAapterBean, bytes);
//                    if (i == 6) {
//                        Lz4Util.createFile(bytes, MyApplication.get().getFilesDir().getAbsolutePath() + "/" + "aaaaaaaab.txt");
//                    }
//                    cleanRecords.add(cleanRecorAapterBean);
//                }
//                deferredObject.resolve(cleanRecords);
//                LogUtils.i("getCleanRecord :记录 结束 " + new Gson().toJson(cleanRecords));
//                Event.newBuilder().type(Event.MESSAGE_TYPE_GET_CLEAN_RECORD).result(true).content(cleanRecords).send();
//            }
//        }).fail(new FailCallback<TuyaSdkException>() {
//            @Override
//            public void onFail(TuyaSdkException e) {
//                deferredObject.reject(e);
//                Event.newBuilder().type(Event.MESSAGE_TYPE_GET_CLEAN_RECORD).result(false).content(e.getCode()).send();
//            }
//        });
//        return deferredObject.promise();
//    }
//
//    @Override
//    public Promise<CleanRecord, TuyaSdkException> getCleanRecordDetail(GetCleanRecordDetailParam param) {
//        //除了rs11 其他产品不用再调用获取记录详情接口 直接把内容返回
//        DeferredObject<CleanRecord, TuyaSdkException> deferredObject = new DeferredObject<>();
//        deferredObject.resolve(param.getCleanRecord());
//        Event.newBuilder().type(Event.MESSAGE_TYPE_GET_CLEAN_RECORD_DETAIL).result(true).content(param.getCleanRecord()).send();
//        return deferredObject.promise();
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> getCleanStatistic() {
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> startSweep(CleanParam param) {
////根据类型判断是什么模式的开始清扫
//        HashMap<String, Object> hashMap = null;
//        int cleanType = param.getType();
//        if (cleanType == RobotStatus.MODE_AUTO_CLEAN) {
//            //全局清扫
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.SWITCH_GO, true);
//            LogUtils.i("startSweep " + JSONObject.toJSONString(hashMap));
//           */
///* TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//            hashMap = new HashMap<>();*//*
//
//            hashMap.put(TuyaLaserConstant.MODE, "smart");
//            return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        } else if (cleanType == RobotStatus.MODE_CUSTOM_CLEAN) {
//            //划区清扫
//            zoneClean(param);
//        } else if (cleanType == RobotStatus.MODE_ROOM_CLEAN) {
//            //选择房间
//            roomClean(param);
//        } else if (cleanType == RobotStatus.MODE_SPOT_CLEAN) {
//            //局部清扫
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.MODE, "part");
//            return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//        return null;
//    }
//
//    public Promise<?, TuyaSdkException> zoneClean(CleanParam param) {
//        Robot robot = AppContext.get().getCurrentDevice();
//        //区域
//        List<Byte> areaBytes = new ArrayList<>();
//        int areaCount = 0;
//        areaBytes.add((byte) 0x00);
//        areaBytes.add((byte) 0x00);
//
//        for (CleanParam.SweepParam sweepParam : param.getSweepParamList()) {
//            CleanParam.AreaSweepParam areaSweepParam = (CleanParam.AreaSweepParam) sweepParam;
//            CleanAreaInfo areaInfo = (CleanAreaInfo) areaSweepParam.getArea();
//            if (areaInfo.getType() != AreaInfo.TYPE_CLEAN) {
//                continue;
//            }
//
//            areaBytes.set(0, (byte) (areaInfo.getCleanTimes() & 0xff));
//            Log.d("nnn", "set clean times is " + areaInfo.getCleanTimes());
//            areaBytes.set(1, (byte) ++areaCount);
//            List<Double> points = areaInfo.getBorder();
//            areaBytes.add((byte) (points.size() / 2));
//            for (int i = 0; i < points.size() / 2; i++) {
//                double x = points.get(i * 2);
//                double y = points.get(i * 2 + 1);
//                PointF pointF = new PointF((float) x, (float) y);
//                ArrayList<Short> point = TuyaPublicMapDataParser.getWorldPoint(pointF, (TuyaLaserMap) robot.getMap().getMap());
//                byte[] byte1x = StringUtils.convertShortToTwoBytes(point.get(0));
//                byte[] byte1y = StringUtils.convertShortToTwoBytes(point.get(1));
//                areaBytes.add(byte1x[0]);
//                areaBytes.add(byte1x[1]);
//                areaBytes.add(byte1y[0]);
//                areaBytes.add(byte1y[1]);
//            }
//        }
//
//        Promise<Void, TuyaSdkException> result = null;
//        byte[] sumData;
//        byte[] data;
//
//        if (areaBytes.size() > 0) {
//            sumData = new byte[areaBytes.size()];
//
//            for (int i = 0; i < areaBytes.size(); i++) {
//                sumData[i] = areaBytes.get(i);
//            }
//
//            data = getProtocolPackage((byte) 0x28, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("clean area " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        return result;
//    }
//
//    public Promise<?, TuyaSdkException> setRoomCleanOrder(List<Byte> roomOrder) {
//        Robot robot = AppContext.get().getCurrentDevice();
//        roomOrder = new ArrayList<>();
//        int len = robot.getMap().getRoom().size();
//        Log.d("order", "order size is" + len);
//        roomOrder.add((byte) (len & 0xff));
//        for (int i = 0; i < len; i++) {
//            if (robot.getMap().getRoom().get(i).getOrder() > 0) {
//                roomOrder.add((byte) ((robot.getMap().getRoom().get(i).getId()) & 0xff));
//            }
//        }
//
//        for (int i = 0; i < len; i++) {
//            int index = robot.getMap().getRoom().get(i).getOrder() - 1;
//            if (index >= 0) {
//                roomOrder.set(index + 1, (byte) ((robot.getMap().getRoom().get(i).getId()) & 0xff));
//            }
//        }
//
//        Log.d("order", "roomBytes size is" + roomOrder.size());
//        for (int i = 0; i < roomOrder.size(); i++) {
//            Log.d("order", "roomBytes value is" + roomOrder.get(i));
//        }
//
//        int roomNum = roomOrder.size() - 1;
//        roomOrder.set(0, (byte) (roomNum & 0xff));
//        Promise<Void, TuyaSdkException> result = null;
//        byte[] sumData;
//        byte[] data;
//
//        if (roomOrder.size() > 0) {
//            sumData = new byte[roomOrder.size()];
//
//            for (int i = 0; i < roomOrder.size(); i++) {
//                sumData[i] = roomOrder.get(i);
//            }
//
//            data = getProtocolPackage((byte) 0x26, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("clean area " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        return result;
//    }
//
//    public Promise<?, TuyaSdkException> roomClean(CleanParam param) {
//        //设置房间清扫顺序
//        List<Byte> roomOrder = new ArrayList<>();
//        List<CleanParam.SweepParam> sweepParamList = param.getSweepParamList();
//        int len = sweepParamList.size();
//        Log.d("selectedRoom", "selectedRoom size is" + len);
//        roomOrder.add((byte) (len & 0xff));
//
//        byte cleanTimes;
//        CleanParam.RoomSweepParam sweepParam = ((CleanParam.RoomSweepParam) sweepParamList.get(0));
//        cleanTimes = (byte) (sweepParam.cleanSettings.getCleanTimes() & 0xff);
//
//        for (int i = 0; i < sweepParamList.size(); i++) {
//            CleanParam.RoomSweepParam roomSweepParam = ((CleanParam.RoomSweepParam) sweepParamList.get(i));
//            roomOrder.add((byte) ((roomSweepParam.room.getId()) & 0xff));
//        }
//
//        Promise<Void, TuyaSdkException> result = null;
//        byte[] sumData;
//        byte[] data;
//
//        //区域清扫
//        List<Byte> areaBytes = new ArrayList<>();
//        areaBytes.add(cleanTimes);
//        areaBytes.add((byte) (roomOrder.size() - 1));
//        for (int i = 1; i < roomOrder.size(); i++) {
//            areaBytes.add(roomOrder.get(i));
//        }
//
//        if (areaBytes.size() > 0) {
//            sumData = new byte[areaBytes.size()];
//
//            for (int i = 0; i < areaBytes.size(); i++) {
//                sumData[i] = areaBytes.get(i);
//            }
//
//            data = getProtocolPackage((byte) 0x14, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("clean area " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        return result;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> pauseSweep() {
//        HashMap<String, Object> hashMap = null;
//
//        //        hashMap = new HashMap<>();
//        //        hashMap.put("1", true);
//        //        LogUtils.i("startSweep " + JSONObject.toJSONString(hashMap));
//        //        TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.PAUSE, true);
//        LogUtils.i("  pauseSweep " + JSONObject.toJSONString(hashMap));
//        TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> continueSweep(CleanParam param) {
//        //一薇的划区清扫的继续 zw x3  需要重新带划区信息 重新清扫
//        // X3s直接发继续就行 其他的的暂时也直接发继续
//        HashMap<String, Object> hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.PAUSE, false);
//        LogUtils.i("  continueSweep " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> stopSweep() {
//        HashMap<String, Object> hashMap = null;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.SWITCH_GO, false);
//        LogUtils.i("stopSweep " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> startRecharge() {
//        HashMap<String, Object> hashMap = null;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.SWITCH_CHARGE, true);
//        LogUtils.i("startRecharge " + JSONObject.toJSONString(hashMap));
//      */
///*  TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        hashMap = new HashMap<>();*//*
//
//        hashMap.put(TuyaLaserConstant.MODE, "chargego");
//        TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//
//        //（需要兼容：goto_charge）防止涂鸦面板更改（LF27/G20不走这里单独集成该方法）
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.MODE, "goto_charge");
//        TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        LogUtils.i("startRecharge " + JSONObject.toJSONString(hashMap));
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> pauseRecharge() {
//        HashMap<String, Object> hashMap = null;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.SWITCH_CHARGE, true);
//        LogUtils.i("startRecharge " + JSONObject.toJSONString(hashMap));
//        TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.PAUSE, true);
//        LogUtils.i("pauseRecharge " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> continueRecharge() {
//        HashMap<String, Object> hashMap = null;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.SWITCH_CHARGE, true);
//        LogUtils.i("startRecharge " + JSONObject.toJSONString(hashMap));
//        TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.PAUSE, false);
//        LogUtils.i("continueRecharge " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> stopRecharge() {
//        HashMap<String, Object> hashMap = null;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.SWITCH_CHARGE, false);
//        LogUtils.i("stopRecharge " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> startRemoteControl() {
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> remoteControl(RemoteControlParam param) {
//        RemoteControlParam.Movement moveDirection = param.getMotion();
//        String instruct = null;
//        if (moveDirection == RemoteControlParam.Movement.LEFT) {
//            instruct = "turn_left";
//        } else if (moveDirection == RemoteControlParam.Movement.RIGHT) {
//            instruct = "turn_right";
//        } else if (moveDirection == RemoteControlParam.Movement.FORWORD) {
//            instruct = "foward";
//            TuyaSdk.get().publishDps(genDp(TuyaLaserConstant.DIRECTION_CONTROL, "forward"));
//        } else if (moveDirection == RemoteControlParam.Movement.BACKWORD) {
//            instruct = "backward";
//        } else if (moveDirection == RemoteControlParam.Movement.STOP) {
//            instruct = "stop";
//        } else {
//            return null;
//        }
//        return TuyaSdk.get().publishDps(genDp(TuyaLaserConstant.DIRECTION_CONTROL, instruct));
//    }
//
//    */
///**
//     * 退出遥控
//     *
//     * @return
//     *//*
//
//    @Override
//    public Promise<?, TuyaSdkException> stopRemoteControl() {
//        return TuyaSdk.get().publishDps(genDp(TuyaLaserConstant.QUIT_REMOTE_CONTROL_MODE, true));
//    }
//
//    */
///**
//     * 定位
//     *
//     * @return
//     *//*
//
//    @Override
//    public Promise<?, TuyaSdkException> locateDevice() {
//        return TuyaSdk.get().publishDps(genDp(TuyaLaserConstant.SEEK, true));
//    }
//
//    */
///**
//     * 立即集尘
//     *
//     * @return
//     *//*
//
//    @Override
//    public Promise<?, TuyaSdkException> collectDust() {
//        HashMap<String, Object> hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.DUST_COLLECTION_SWITCH, true);
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> getDeviceState() {
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> getMapList() {
//        DeferredObject<List<CleanRecord>, TuyaSdkException> deferredObject = new DeferredObject<>();
//
//        TuyaSdk.get().queryMultiMap().done(new DoneCallback<List<RecordResult>>() {
//            @Override
//            public void onDone(List<RecordResult> strings) {
//                List<CleanRecord> mapList = new ArrayList<>();
//                for (RecordResult recordResult : strings) {
//                    byte[] bytes = recordResult.getData();
//                    CleanRecord cleanRecord = new CleanRecord();
//                    TuyaPublicMapDataParser.parseMultiMap(cleanRecord, bytes);
//                    cleanRecord.setUrl(recordResult.getUrl());
//                    cleanRecord.setId(recordResult.getId());
//                    Log.d("testMultiMap", "map id is " + recordResult.getId());
//                    cleanRecord.setName(recordResult.getFileName());
//                    cleanRecord.setExtend(recordResult.getExtend());
//                    mapList.add(cleanRecord);
//                    Log.d("testMultiMap", "file name " + recordResult.getFileName());
//                }
//                Log.d("testMultiMap", "size is " + mapList.size());
//                deferredObject.resolve(mapList);
//                Event.newBuilder().type(Event.MESSAGE_TYPE_GET_MULTI_MAP).result(true).content(mapList).send();
//            }
//        }).fail(new FailCallback<TuyaSdkException>() {
//            @Override
//            public void onFail(TuyaSdkException e) {
//                deferredObject.reject(new TuyaSdkException(e.getCode(), e.getMessage()));
//                Event.newBuilder().type(Event.MESSAGE_TYPE_GET_MULTI_MAP).result(false).content(e.getCode()).send();
//            }
//        });
//        return deferredObject.promise();
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> setCurrentMap(SetMapParam param) {
//        List<Byte> bytes = new ArrayList<>();
//
//        int extendId = Integer.parseInt(param.getExtend().split("_")[2]);
//        byte[] mapIdBytes = StringUtils.intToByteArray(extendId);
//        for (int i = 0; i < mapIdBytes.length; i++) {
//            bytes.add(mapIdBytes[i]);
//        }
//
//        byte[] urlLen = null;
//        byte[] urlBytes = null;
//        try {
//            urlBytes = param.getUrl().getBytes("utf-8");
//            String name = new String(urlBytes, "utf-8");
//            Log.d("ZW", "url is " + name);
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//        if (urlBytes != null && urlBytes.length > 0) {
//            urlLen = StringUtils.intToByteArray(urlBytes.length);
//        }
//
//        for (int i = 0; i < urlLen.length; i++) {
//            bytes.add(urlLen[i]);
//        }
//
//        for (int i = 0; i < urlBytes.length; i++) {
//            bytes.add(urlBytes[i]);
//        }
//
//        Promise<Void, TuyaSdkException> result = null;
//        byte[] sumData;
//        byte[] data;
//
//        if (bytes.size() > 0) {
//            sumData = new byte[bytes.size()];
//
//            for (int i = 0; i < bytes.size(); i++) {
//                sumData[i] = bytes.get(i);
//            }
//
//            data = getProtocolPackage1((byte) 0x2E, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("setCurrentMap " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        return result;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> removeMap(RemoveMapParam param) {
//        byte[] sumData = StringUtils.intToByteArray((int) param.getMapId());
//
//        Promise<Void, TuyaSdkException> result = null;
//
//        byte[] data;
//        if (sumData.length > 0) {
//            data = getProtocolPackage1((byte) 0x2C, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("clean area " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        return result;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> resetMap(ResetMapParam param) {
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.RESET_MAP, true);
//        LogUtils.i("reset map " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> saveMap(SaveMapParam param) {
//        List<Byte> bytes = new ArrayList<>();
//        bytes.add((byte) (0x01));
//
//        Promise<Void, TuyaSdkException> result = null;
//        byte[] sumData;
//        byte[] data;
//
//        if (bytes.size() > 0) {
//            sumData = new byte[bytes.size()];
//
//            for (int i = 0; i < bytes.size(); i++) {
//                sumData[i] = bytes.get(i);
//            }
//
//            data = getProtocolPackage1((byte) 0x2A, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("clean area " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        return result;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> renameMap(RenameMapParam param) {
//        return TuyaSdk.get().renameMultiMap(param);
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> requestMap() {
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.REQUEST, "get_both");
//        LogUtils.i("requestMap " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> requestPath(GetPathParam param) {
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.REQUEST, "get_path");
//        LogUtils.i("requestMap " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> requestArea() {
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.REQUEST, "get_map");
//        LogUtils.i("requestArea " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> setArea(SetAreaParam param) {
//        Robot robot = AppContext.get().getCurrentDevice();
//        //虚拟墙设置 / 禁区设置（禁过、禁拖）
//        List<Byte> lineBytes = new ArrayList<>();
//        List<Byte> areaBytes = new ArrayList<>();
//        int lineCount = 0;
//        int areaCount = 0;
//        lineBytes.add((byte) 0x00);
//        areaBytes.add((byte) 0x00);
//        for (AreaInfo areaInfo : param.getAreaList()) {
//            if (areaInfo.getType() == AreaInfo.TYPE_CLEAN) {
//                continue;
//            }
//
//            if (areaInfo.getType() == AreaInfo.TYPE_FORBIDDEN_LINE) {
//                lineBytes.set(0, (byte) ++lineCount);
//                List<Double> points = areaInfo.getBorder();
//                for (int i = 0; i < points.size() / 2; i++) {
//                    double x = points.get(i * 2);
//                    double y = points.get(i * 2 + 1);
//                    PointF pointF = new PointF((float) x, (float) y);
//                    ArrayList<Short> point = TuyaPublicMapDataParser.getWorldPoint(pointF, (TuyaLaserMap) robot.getMap().getMap());
//                    byte[] byte1x = StringUtils.convertShortToTwoBytes(point.get(0));
//                    byte[] byte1y = StringUtils.convertShortToTwoBytes(point.get(1));
//                    lineBytes.add(byte1x[0]);
//                    lineBytes.add(byte1x[1]);
//                    lineBytes.add(byte1y[0]);
//                    lineBytes.add(byte1y[1]);
//                }
//            }
//
//            if (areaInfo.getType() == AreaInfo.TYPE_FORBIDDEN_MOP || areaInfo.getType() == AreaInfo.TYPE_FORBIDDEN) {
//                areaBytes.set(0, (byte) ++areaCount);
//                if (areaInfo.getType() == AreaInfo.TYPE_FORBIDDEN_MOP) {
//                    areaBytes.add((byte) 0x02);
//                } else if (areaInfo.getType() == AreaInfo.TYPE_FORBIDDEN) {
//                    areaBytes.add((byte) 0x00);
//                }
//                List<Double> points = areaInfo.getBorder();
//                areaBytes.add((byte) (points.size() / 2));
//                for (int i = 0; i < points.size() / 2; i++) {
//                    double x = points.get(i * 2);
//                    double y = points.get(i * 2 + 1);
//                    PointF pointF = new PointF((float) x, (float) y);
//                    ArrayList<Short> point = TuyaPublicMapDataParser.getWorldPoint(pointF, (TuyaLaserMap) robot.getMap().getMap());
//                    byte[] byte1x = StringUtils.convertShortToTwoBytes(point.get(0));
//                    byte[] byte1y = StringUtils.convertShortToTwoBytes(point.get(1));
//                    areaBytes.add(byte1x[0]);
//                    areaBytes.add(byte1x[1]);
//                    areaBytes.add(byte1y[0]);
//                    areaBytes.add(byte1y[1]);
//                }
//            }
//        }
//
//        Promise<Void, TuyaSdkException> result = null;
//        byte[] sumData;
//        byte[] data;
//
//        if (lineBytes.size() > 0) {
//            sumData = new byte[lineBytes.size()];
//
//            for (int i = 0; i < lineBytes.size(); i++) {
//                sumData[i] = lineBytes.get(i);
//            }
//
//            data = getProtocolPackage((byte) 0x12, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("forbiden line " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        if (areaBytes.size() > 0) {
//            sumData = new byte[areaBytes.size()];
//
//            for (int i = 0; i < areaBytes.size(); i++) {
//                sumData[i] = areaBytes.get(i);
//            }
//
//            data = getProtocolPackage((byte) 0x1A, sumData);
//
//            HashMap<String, Object> hashMap;
//            hashMap = new HashMap<>();
//            hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//            LogUtils.i("forbiden area " + JSONObject.toJSONString(hashMap));
//            result = TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//        }
//
//        return result;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> intelligentPartition() {
//        return null;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> requestRoom() {
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.REQUEST, "get_map");
//        LogUtils.i("requestMap " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> renameRoom(RenameRoomParam param) {
//        List<Byte> bytes = new ArrayList<>();
//
//        byte[] nameBytes = null;
//        int nameLen = 0;
//        try {
//            nameBytes = param.name.getBytes("utf-8");
//            String name = new String(nameBytes, "utf-8");
//            Log.d("ZW", "room name is " + name);
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//        if (nameBytes != null && nameBytes.length > 0 && nameBytes.length <= 19) {
//            nameLen = nameBytes.length;
//        } else if (nameBytes.length > 19) {
//            nameLen = 19;
//        }
//
//        //data
//        bytes.add((byte) (1));
//        bytes.add((byte) (param.roomId));
//        bytes.add((byte) nameLen);
//
//        for (int i = 0; i < nameLen; i++) {
//            bytes.add(nameBytes[i]);
//        }
//        for (int i = 0; i < 19 - nameLen; i++) {
//            bytes.add((byte) 0x00);
//        }
//
//        byte[] sumData = new byte[bytes.size()];
//
//        for (int i = 0; i < bytes.size(); i++) {
//            sumData[i] = bytes.get(i);
//        }
//
//        byte[] data = getProtocolPackage((byte) 0x24, sumData);
//
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//        LogUtils.i("renameRoom " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> mergeRoom(MergeRoomParam param) {
//        List<Byte> bytes = new ArrayList<>();
//        bytes.add((byte) (param.room1));
//        bytes.add((byte) (param.room2));
//        byte[] sumData = new byte[bytes.size()];
//        for (int i = 0; i < bytes.size(); i++) {
//            sumData[i] = bytes.get(i);
//        }
//
//        byte[] data = getProtocolPackage((byte) 0x1E, sumData);
//
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//        LogUtils.i("mergeRoom " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> resetRoom() {
//        //重置分区
//        List<Byte> bytes = new ArrayList<>();
//        bytes.add((byte) 0xAA);
//        bytes.add((byte) 0x00);
//        bytes.add((byte) 0x01);
//        bytes.add((byte) 0x20);
//        byte checkSum = (byte) (0x20);
//        bytes.add(checkSum);
//        byte[] data = new byte[bytes.size()];
//        for (int i = 0; i < bytes.size(); i++) {
//            data[i] = bytes.get(i);
//        }
//
//        HashMap<String, Object> hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//        LogUtils.i("resetRoom " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> splitRoom(SplitRoomParam param) {
//        Robot robot = AppContext.get().getCurrentDevice();
//        TuyaLaserMap map = (TuyaLaserMap) robot.getMap().getMap();
//
//        List<Byte> bytes = new ArrayList<>();
//        bytes.add((byte) (param.roomId));
//
//        //第一个点
//        ArrayList<Short> point1 = TuyaPublicMapDataParser.getWorldPoint(param.point1, map);
//        short point1x = point1.get(0);
//        short point1y = point1.get(1);
//        byte[] byte1x = StringUtils.convertShortToTwoBytes(point1x);
//        byte[] byte1y = StringUtils.convertShortToTwoBytes(point1y);
//        bytes.add(byte1x[0]);
//        bytes.add(byte1x[1]);
//        bytes.add(byte1y[0]);
//        bytes.add(byte1y[1]);
//
//        //第二个点
//        ArrayList<Short> point2 = TuyaPublicMapDataParser.getWorldPoint(param.point2, map);
//        short point2x = point2.get(0);
//        short point2y = point2.get(1);
//        byte[] byte2x = StringUtils.convertShortToTwoBytes(point2x);
//        byte[] byte2y = StringUtils.convertShortToTwoBytes(point2y);
//        bytes.add(byte2x[0]);
//        bytes.add(byte2x[1]);
//        bytes.add(byte2y[0]);
//        bytes.add(byte2y[1]);
//
//        byte[] sumData = new byte[bytes.size()];
//        for (int i = 0; i < bytes.size(); i++) {
//            sumData[i] = bytes.get(i);
//        }
//
//        byte[] data = getProtocolPackage((byte) 0x1C, sumData);
//
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//        LogUtils.i("splitRoom " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    public byte[] getProtocolPackage(byte cmd, byte[] data) {
//        int protocalPackageLen = data.length + 5;
//        byte[] protocalPackage = new byte[protocalPackageLen];
//        protocalPackage[0] = ((byte) 0xAA);
//        protocalPackage[1] = ((byte) 0x00);
//        //数据长度（cmd + data）
//        int DataLen = 1 + data.length;
//        Log.d("pppppp", "appointment dataLen is " + DataLen);
//        protocalPackage[2] = ((byte) DataLen);
//        protocalPackage[3] = ((byte) cmd);
//        System.arraycopy(data, 0, protocalPackage, 4, data.length);
//        byte checkSum = cmd;
//        for (int i = 0; i < data.length; i++) {
//            checkSum += data[i];
//        }
//        protocalPackage[protocalPackageLen - 1] = checkSum;
//        return protocalPackage;
//    }
//
//    public byte[] getProtocolPackage1(byte cmd, byte[] data) {
//        int protocalPackageLen = data.length + 8;
//        byte[] protocalPackage = new byte[protocalPackageLen];
//        protocalPackage[0] = ((byte) 0xAB);
//        protocalPackage[1] = ((byte) 0x00);
//        //数据长度（cmd + data）
//        int dataLen = 1 + data.length;
//        byte[] lenBytes = StringUtils.intToByteArray(dataLen);
//        System.arraycopy(lenBytes, 0, protocalPackage, 2, lenBytes.length);
//        protocalPackage[6] = cmd;
//        System.arraycopy(data, 0, protocalPackage, 7, data.length);
//        byte checkSum = cmd;
//        for (int i = 0; i < data.length; i++) {
//            checkSum += data[i];
//        }
//        protocalPackage[protocalPackageLen - 1] = checkSum;
//        return protocalPackage;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> clearCustomMode(ClearCustomModeParam param) {
//        List<byte[]> dataList = new ArrayList<>();
//        for (Room room : param.getRoomList()) {
//            byte[] data = new byte[5];
//            data[0] = (byte) (room.getId() & 0xff);
//            data[1] = (byte) 0xff;
//            data[2] = (byte) 0xff;
//            data[3] = (byte) 0xff;
//            data[4] = (byte) 0x01;
//            dataList.add(data);
//        }
//
//        int roomDataLen = dataList.size() * 5;
//        byte[] roomData = new byte[roomDataLen];
//        for (int i = 0; i < dataList.size(); i++) {
//            System.arraycopy(dataList.get(i), 0, roomData, i * 5, dataList.get(i).length);
//        }
//
//        byte[] sumData = new byte[roomDataLen + 1];
//        sumData[0] = (byte) param.getRoomList().size();
//        System.arraycopy(roomData, 0, sumData, 1, roomData.length);
//
//        byte[] data = getProtocolPackage((byte) 0x22, sumData);
//
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//        LogUtils.i("saveCustomMode" + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> saveCustomMode(SaveCustomModeParam param) {
//        List<byte[]> dataList = new ArrayList<>();
//        for (Room room : param.getRoomList()) {
//            byte[] data = new byte[5];
//            data[0] = (byte) (room.getId() & 0xff);
//            data[1] = (byte) (room.getSuction() & 0xff);
//            data[2] = (byte) (room.getHumidity() & 0xff);
//            data[3] = (byte) 0xff;
//            data[4] = (byte) (room.getCleanTimes() & 0xff);
//            dataList.add(data);
//        }
//
//        int roomDataLen = dataList.size() * 5;
//        byte[] roomData = new byte[roomDataLen];
//        for (int i = 0; i < dataList.size(); i++) {
//            System.arraycopy(dataList.get(i), 0, roomData, i * 5, dataList.get(i).length);
//        }
//
//        byte[] sumData = new byte[roomDataLen + 1];
//        sumData[0] = (byte) param.getRoomList().size();
//        System.arraycopy(roomData, 0, sumData, 1, roomData.length);
//
//        byte[] data = getProtocolPackage((byte) 0x22, sumData);
//
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//        LogUtils.i("saveCustomMode" + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> setVoice(VoiceParam param) {
//        int languageId = param.getId();
//        byte[] md5 = null;
//        byte[] md6 = null;
//        byte[] url = null;
//        int md5Len = param.getMd5sum().length();
//        int urlLen = param.getDownUrl().length();
//        try {
//            md5 = param.getMd5sum().getBytes("utf-8");
//            url = param.getDownUrl().getBytes("utf-8");
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//        List<Byte> bytes = new ArrayList<>();
//        byte[] id = StringUtils.intToByteArray(languageId);
//        for (byte value : id) {
//            bytes.add(value);
//        }
//        bytes.add((byte) (md5Len & 0xff));
//
//        for (byte value : md5) {
//            bytes.add(value);
//        }
//
//        byte[] urlLens = StringUtils.intToByteArray(urlLen);
//        for (byte value : urlLens) {
//            bytes.add(value);
//        }
//
//        for (byte value : url) {
//            bytes.add(value);
//        }
//
//        byte[] sumData = new byte[bytes.size()];
//        for (int i = 0; i < bytes.size(); i++) {
//            sumData[i] = bytes.get(i);
//        }
//
//        byte[] data = getProtocolPackage1((byte) 0x34, sumData);
//
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.COMMAND_TRANS, StringUtils.byte2hex(data));
//        LogUtils.i("mergeRoom " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    */
///**
//     * 云端获取预约列表(现在无法主动刷新)
//     *//*
//
//    public Promise<Void, TuyaSdkException> getAppointmentListFromCloud() {
//        DeferredObject<Void, TuyaSdkException> deferredObject = new DeferredObject<>();
//        Robot robot = AppContext.get().getCurrentDevice();
//        String deviceId = robot.getDeviceId();
//        TuyaHomeSdk.getTimerInstance().getTimerList("yingxing_robot_task", deviceId, TimerDeviceTypeEnum.DEVICE, new ITuyaDataCallback<TimerTask>() {
//            @Override
//            public void onSuccess(TimerTask timerTask) {
//                //Toast.makeText(mContext, "获取设备下的定时 成功", Toast.LENGTH_LONG).show();
//                LogUtils.i("Cloud alarm list : " + new Gson().toJson(timerTask));
//                List<Appointment> mList = new ArrayList<>();
//                TimerTaskStatus status = timerTask.getTimerTaskStatus();
//                ArrayList<Timer> timerList = timerTask.getTimerList();
//                if (timerList != null) {
//                    for (int j = 0; j < timerList.size(); j++) {
//                        Timer timer = timerList.get(j);
//                        Appointment appointment = new Appointment();
//                        appointment.setId(Integer.parseInt(timer.getTimerId()));
//                        appointment.setRepeat(AlarmUtils.loopsToPeriod(timer.getLoops()));
//                        String time = timer.getTime();//18:12
//                        String[] split = time.split(":");
//                        int h = Integer.parseInt(split[0]) * 3600;
//                        int min = Integer.parseInt(split[1]) * 60;
//                        appointment.setTime(h + min);
//                        appointment.setEnable(timer.getStatus() == 1);
//                        String value = timer.getValue();
//                        try {
//                            org.json.JSONObject jsonObject = new org.json.JSONObject(value);
//
//                            if (jsonObject.has("9")) {
//                                String suction = jsonObject.getString("9");
//                                com.yx.robot.bean.robot.CleanParam ac = new com.yx.robot.bean.robot.CleanParam();
//                                if (suction.equals("closed")) {
//                                    ac.suction = 0;
//                                } else if (suction.equals("gentle")) {
//                                    ac.suction = 1;
//                                } else if (suction.equals("normal")) {
//                                    ac.suction = 2;
//                                } else if (suction.equals("strong")) {
//                                    ac.suction = 3;
//                                } else if (suction.equals("max")) {
//                                    ac.suction = 4;
//                                }
//                                appointment.setCleanParam(ac);
//                            }
//                            if (jsonObject.has("10")) {
//                                String water = jsonObject.getString("10");
//                                com.yx.robot.bean.robot.CleanParam ac = new com.yx.robot.bean.robot.CleanParam();
//                                if (water.equals("closed")) {
//                                    ac.humidity = 0;
//                                } else if (water.equals("low")) {
//                                    ac.humidity = 1;
//                                } else if (water.equals("middle")) {
//                                    ac.humidity = 2;
//                                } else if (water.equals("high")) {
//                                    ac.humidity = 3;
//                                }
//                                appointment.setCleanParam(ac);
//                            }
//
//                            if (jsonObject.has("4")) {
//                                String cleanMode = jsonObject.getString("4");
//                                if (cleanMode.equals("smart")) {
//                                    appointment.setCleanMode(0);//全局模式
//                                } else if (cleanMode.equals("select_room")) {
//                                    appointment.setCleanMode(1);//选区模式
//                                } else if (cleanMode.equals("zone")) {
//                                    //划区模式
//                                    appointment.setCleanMode(2);
//                                }
//
//                            }
//
//
//                        } catch (JSONException e) {
//                            e.printStackTrace();
//                        }
//                        mList.add(appointment);
//                    }
//                }
//                deferredObject.resolve(null);
//                robot.setAppointmentList(mList);
//                Event.newBuilder().type(Event.MESSAGE_TYPE_QUERY_ALARM).result(true).content(mList).send();
//            }
//
//            @Override
//            public void onError(String errorCode, String errorMessage) {
//                LogUtils.i("ZW query alarm list error" + "获取设备下的定时 失败 " + errorMessage);
//                deferredObject.reject(new TuyaSdkException(errorCode, errorMessage));
//                Event.newBuilder().type(Event.MESSAGE_TYPE_QUERY_ALARM).result(false).content(errorMessage).send();
//            }
//        });
//        return deferredObject.promise();
//    }
//
//    public Promise<Void, TuyaSdkException> getBaseStationVersion() {
//        return null;
//    }
//
//    public String getLoops(List<Integer> repeat) {
//        return "" + (repeat.contains(0) ? 1 : 0) + (repeat.contains(1) ? 1 : 0) +
//                (repeat.contains(2) ? 1 : 0) + (repeat.contains(3) ? 1 : 0) +
//                (repeat.contains(4) ? 1 : 0) + (repeat.contains(5) ? 1 : 0) + (repeat.contains(6) ? 1 : 0);
//    }
//
//
//    @Override
//    public String getErrMsgByCode(Context context, String errorCode) {
//        int srrCode = Integer.parseInt(errorCode);
//        int errCode = getErrorCode(srrCode - 1);
//        String errType = "";
//        String errDetail = "";
//        switch (errCode) {
//            case 1:
//                errType = context.getResources().getString(R.string.Error1_ZW);
//                break;
//            case 2:
//                errType = context.getResources().getString(R.string.Error2_ZW);
//                break;
//            case 3:
//                errType = context.getResources().getString(R.string.Error3_ZW);
//                break;
//            case 4:
//                errType = context.getResources().getString(R.string.Error4_ZW);
//                break;
//            case 5:
//                errType = context.getResources().getString(R.string.Error5_ZW);
//                break;
//            case 6:
//                errType = context.getResources().getString(R.string.Error6_ZW);
//                break;
//            case 7:
//                errType = context.getResources().getString(R.string.Error7_ZW);
//                break;
//            case 8:
//                errType = context.getResources().getString(R.string.Error8_ZW);
//                break;
//            case 9:
//                errType = context.getResources().getString(R.string.Error9_ZW);
//                break;
//            case 10:
//                errType = context.getResources().getString(R.string.Error10_ZW);
//                break;
//            case 11:
//                errType = context.getResources().getString(R.string.Error11_ZW);
//                break;
//            case 12:
//                errType = context.getResources().getString(R.string.Error12_ZW);
//                break;
//            case 13:
//                errType = context.getResources().getString(R.string.Error13_ZW);
//                break;
//            case 14:
//                errType = context.getResources().getString(R.string.Error14_ZW);
//                break;
//            case 15:
//                errType = context.getResources().getString(R.string.Error15_ZW);
//                break;
//            case 16:
//                errType = context.getResources().getString(R.string.Error16_ZW);
//                break;
//            case 17:
//                errType = context.getResources().getString(R.string.Error17_ZW);
//                break;
//            case 18:
//                errType = context.getResources().getString(R.string.Error18_ZW);
//                break;
//            case 19:
//                errType = context.getResources().getString(R.string.Error19_ZW);
//                break;
//            case 20:
//                errType = context.getResources().getString(R.string.Error20_ZW);
//                break;
//            case 21:
////                errType = context.getResources().getString(R.string.Error21_ZW);
//                break;
//            case 22:
//                errType = context.getResources().getString(R.string.Error22_ZW);
//                break;
//            case 23:
//                errType = context.getResources().getString(R.string.Error23_ZW);
//                break;
//            case 24:
//                errType = context.getResources().getString(R.string.Error24_ZW);
//                break;
//            case 25:
//                errType = context.getResources().getString(R.string.Error25_ZW);
//                break;
//            case 26:
//                errType = context.getResources().getString(R.string.Error26_ZW);
//                break;
//            case 27:
//                errType = context.getResources().getString(R.string.Error27_ZW);
//                break;
//            case 28:
//                errType = context.getResources().getString(R.string.Error28_ZW);
//                break;
//            case 29:
//                errType = context.getResources().getString(R.string.Error29_ZW);
//                break;
//
//        }
//        return errType;
//    }
//
//    @Override
//    public Promise<?, TuyaSdkException> createMap() {
//        HashMap<String, Object> hashMap;
//        hashMap = new HashMap<>();
//        hashMap.put(TuyaLaserConstant.CREATE_MAP, true);
//        LogUtils.i("createMap " + JSONObject.toJSONString(hashMap));
//        return TuyaSdk.get().publishDps(JSONObject.toJSONString(hashMap));
//    }
//
//    private static class InstanceHoder {
//        private static final TuyaLaser TUYA_LASER = new TuyaLaser();
//    }
//*/
//
//
//}
